<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\common\library\AipFace;

/**
 * 人脸识别
 * @package app\api\controller
 */
class Face extends Api
{
    protected $noNeedLogin = ['login'];
    protected $noNeedRight = ['*'];

    protected $client;
    protected $group = 'assess';

    public function _initialize()
    {
        parent::_initialize();
    }

    /**
     * @ApiTitle    (人脸检测)
     * @ApiAuthor   (Zhenzh)
     * @ApiDate     (2020/2/20)
     * @ApiSummary  (描述)
     * @ApiBody     ()
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/face/detect)
     * @ApiParams   (name="image", type="string", required=true, description="图片信息「总数据大小应小于10M，图片上传方式根据 image_type 来判断」", sample="")
     * @ApiParams   (name="image_type", type="string", required=true, description="图片类型 <br>BASE64：图片的 base64 值，base64 编码后的图片数据「base64,后面开始截取」，编码后的图片大小不超过 2M；<br>URL：图片的 URL 地址「可能由于网络等原因导致下载图片时间过长」；<br>FACE_TOKEN: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的 FACE_TOKEN ，同一张图片多次检测得到的 FACE_TOKEN 是同一个；", sample="")
     * @ApiReturnParams   (name="code", type="integer", required=true, description="状态码 1正常 0错误", sample="1")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回", sample="")
     * @ApiReturn   ()
     */
    public function detect()
    {
        // 图片信息 (**总数据大小应小于10M**)，图片上传方式根据image_type来判断
        $image = $this->request->request('image');

        // 图片类型
        // **BASE64**:图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M；
        // **URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
        // **FACE_TOKEN**: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的FACE_TOKEN，同一张图片多次检测得到的FACE_TOKEN是同一个
        $image_type = $this->request->request('image_type');

        $ret = AipFace::instance()->detect($image, $image_type);

        if ($ret['error_code']) {
            $this->error($ret['error_msg']);
        }

        $this->success('', $ret['result']);

//        $data = $this->request->post();
//        $ret = $this->post('/api/face/detect', $data);
//        $this->result($ret['msg'], $ret['data'], $ret['code']);
    }

    /**
     * @ApiTitle    (人脸注册)
     * @ApiAuthor   (Zhenzh)
     * @ApiDate     (2020/2/20)
     * @ApiSummary  (描述)
     * @ApiBody     ()
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/face/addUser)
     * @ApiParams   (name="image", type="string", required=true, description="图片信息「总数据大小应小于10M，图片上传方式根据 image_type 来判断」", sample="")
     * @ApiParams   (name="image_type", type="string", required=true, description="图片类型 <br>BASE64：图片的 base64 值，base64 编码后的图片数据「base64,后面开始截取」，编码后的图片大小不超过 2M；<br>URL：图片的 URL 地址「可能由于网络等原因导致下载图片时间过长」；<br>FACE_TOKEN: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的 FACE_TOKEN ，同一张图片多次检测得到的 FACE_TOKEN 是同一个；", sample="")
     * @ApiReturnParams   (name="code", type="integer", required=true, description="状态码 1正常 0错误", sample="1")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回", sample="")
     * @ApiReturn   ({
    "code": 1,
    "msg": "",
    "time": "1582161308",
    "data": {
    "face_token": "7df8fdee248a6752d999d1c57be429ef",
    "location": {
    "left": 240.22,
    "top": 361.82,
    "width": 532,
    "height": 533,
    "rotation": 1
    }
    }
    })
     */
    public function addUser()
    {
        // 图片信息 (**总数据大小应小于10M**)，图片上传方式根据image_type来判断
        $image = $this->request->request('image');
        // 图片类型
        // **BASE64**:图片的base64值，base64编码后的图片数据，编码后的图片大小不超过2M；
        // **URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
        // **FACE_TOKEN**: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的FACE_TOKEN，同一张图片多次检测得到的FACE_TOKEN是同一个
        $image_type = $this->request->request('image_type');
        $group_id = $this->request->request('group_id', 'mp');

        $user_id = $this->auth->id;
        $options = array();
        $options["user_info"] = json_encode(['user_id' => $user_id]);
        $options["action_type"] = "REPLACE";

        // 调用人脸注册
        $ret = AipFace::instance()->addUser($image, $image_type, $group_id, $user_id, $options);

        if ($ret['error_code']) {
            $this->error($ret['error_msg']);
        }

        \app\common\model\BaseUser::where('id', $user_id)->update(['face_token' => $ret['result']['face_token']]);

        $this->success('', $ret['result']);


//        $data = $this->request->post();
//        $data['group_id'] = $this->group;
//        $ret = $this->post('/api/face/addUser', $data);
//        $this->result($ret['msg'], $ret['data'], $ret['code']);
    }

    /**
     * @ApiTitle    (人脸搜索)
     * @ApiAuthor   (Zhenzh)
     * @ApiDate     (2020/2/20)
     * @ApiSummary  (描述)
     * @ApiBody     ()
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/face/search)
     * @ApiParams   (name="image", type="string", required=true, description="图片信息「总数据大小应小于10M，图片上传方式根据 image_type 来判断」", sample="")
     * @ApiParams   (name="image_type", type="string", required=true, description="图片类型 <br>BASE64：图片的 base64 值，base64 编码后的图片数据「base64,后面开始截取」，编码后的图片大小不超过 2M；<br>URL：图片的 URL 地址「可能由于网络等原因导致下载图片时间过长」；<br>FACE_TOKEN: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的 FACE_TOKEN ，同一张图片多次检测得到的 FACE_TOKEN 是同一个；", sample="")
     * @ApiReturnParams   (name="code", type="integer", required=true, description="状态码 1正常 0错误", sample="1")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回", sample="")
     * @ApiReturn   ({
    "code": 1,
    "msg": "",
    "time": "1582161340",
    "data": {
    "face_token": "7df8fdee248a6752d999d1c57be429ef",
    "user_list": [
    {
    "group_id": "assess",
    "user_id": "304",
    "user_info": "",
    "score": 100
    }
    ]
    }
    })
     */
    public function search()
    {
        // 图片信息(**总数据大小应小于10M**)，图片上传方式根据image_type来判断
        $image = $this->request->request('image');

        // 图片类型
        // **BASE64**:图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M；
        // **URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
        // **FACE_TOKEN**: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的FACE_TOKEN，同一张图片多次检测得到的FACE_TOKEN是同一个
        $image_type = $this->request->request('image_type');
        $group_id_list = $this->request->request('group_id_list', 'mp');

        // 如果有可选参数
        $options = array();
        $options["max_face_num"] = 3;
        $options["match_threshold"] = 80;
//        $options["quality_control"] = "NORMAL";
//        $options["liveness_control"] = "LOW";
//        $options["user_id"] = $this->auth->id;
        $options["max_user_num"] = 3;
        // 带参数调用人脸搜索
        $ret = AipFace::instance()->search($image, $image_type, $group_id_list, $options);

        if ($ret['error_code']) {
            $this->error($ret['error_msg']);
        }

        $this->success('', $ret['result']);

//        $data = $this->request->post();
//        $data['group_id_list'] = $this->group;
//        $ret = $this->post('/api/face/search', $data);
//        $this->result($ret['msg'], $ret['data'], $ret['code']);
    }

    /**
     * @ApiTitle    (人脸登录)
     * @ApiAuthor   (Zhenzh)
     * @ApiDate     (2020/2/20)
     * @ApiSummary  (描述)
     * @ApiBody     ()
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/face/login)
     * @ApiParams   (name="image", type="string", required=true, description="图片信息「总数据大小应小于10M，图片上传方式根据 image_type 来判断」", sample="")
     * @ApiParams   (name="image_type", type="string", required=true, description="图片类型 <br>BASE64：图片的 base64 值，base64 编码后的图片数据「base64,后面开始截取」，编码后的图片大小不超过 2M；<br>URL：图片的 URL 地址「可能由于网络等原因导致下载图片时间过长」；<br>FACE_TOKEN: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的 FACE_TOKEN ，同一张图片多次检测得到的 FACE_TOKEN 是同一个；", sample="")
     * @ApiReturnParams   (name="code", type="integer", required=true, description="状态码 1正常 0错误", sample="1")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回", sample="")
     * @ApiReturn   ({
    "code": 1,
    "msg": "Logged in successful",
    "time": "1582161324",
    "data": {
    "userinfo": {
    "id": 304,
    "username": "18911621396",
    "nickname": "甄子涵",
    "mobile": "18911621396",
    "avatar": "/uploads/20200217/231ac9abaf922880b1339417c0ee46e9.jpg",
    "score": 0,
    "school_id": 3,
    "token": "5ed2c6b6-6ca1-471e-9c17-1d77824a5094",
    "user_id": 304,
    "createtime": 1582161327,
    "expiretime": 1584753327,
    "expires_in": 2592000
    }
    }
    })
     */
    public function login()
    {
        // 图片信息(**总数据大小应小于10M**)，图片上传方式根据image_type来判断
        $image = $this->request->request('image');

        // 图片类型
        // **BASE64**:图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M；
        // **URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
        // **FACE_TOKEN**: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的FACE_TOKEN，同一张图片多次检测得到的FACE_TOKEN是同一个
        $image_type = $this->request->request('image_type');
        $group_id_list = $this->request->request('group_id_list', 'mp');

        // 如果有可选参数
        $options = array();
        $options["max_face_num"] = 3;
        $options["match_threshold"] = 80;
//        $options["quality_control"] = "NORMAL";
        //$options["liveness_control"] = "LOW";
        $options["max_user_num"] = 3;

        // 带参数调用人脸搜索
        $ret = AipFace::instance()->search($image, $image_type, $group_id_list, $options);

        if ($ret['error_code']) {
            $this->error($ret['error_msg']);
        }

        $user_list = [];
        if (isset($ret['result']) && isset($ret['result']['user_list'])) {
            $user_list = $ret['result']['user_list'];
        } else {
            $this->error('error');
        }

        $user = current($user_list);
        if ($user && $user['score'] >= 90) {

            $ret = $this->auth->direct($user['user_id']);

            if ($ret) {
                $data = ['userinfo' => $this->auth->getUserinfo()];
                $this->success(__('Logged in successful'), $data);
            } else {
                $this->error($this->auth->getError());
            }
        }

        $this->error('error');


//        $data = $this->request->post();
//        $data['group_id_list'] = $this->group;
//        $ret = $this->post('/api/face/login', $data);
//        $this->result($ret['msg'], $ret['data'], $ret['code']);
    }

}
